package com.offcn.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.offcn.mapper.CheckgroupCheckitemMapper;
import com.offcn.mapper.CheckgroupMapper;
import com.offcn.mapper.CheckitemMapper;
import com.offcn.mapper.SetmealCheckgroupMapper;
import com.offcn.pojo.Checkgroup;
import com.offcn.pojo.CheckgroupCheckitem;
import com.offcn.pojo.Checkitem;
import com.offcn.pojo.SetmealCheckgroup;
import com.offcn.service.CheckgroupService;
import com.offcn.utils.MessageConstant;
import com.offcn.utils.PageResult;
import com.offcn.utils.QueryPageBean;
import com.offcn.utils.Result;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;

/**
 * @program: offcnpe_parent
 * @description:
 * @author: xin yi
 * @create: 2021-07-15 10:57
 */
@Service
public class CheckgroupServiceImpl implements CheckgroupService {

    @Autowired
    private CheckgroupMapper checkgroupMapper;

    @Autowired
    private CheckgroupCheckitemMapper checkgroupCheckitemMapper;

    @Autowired
    private SetmealCheckgroupMapper setmealCheckgroupMapper;


    @Override
    public PageResult checkGroup(QueryPageBean queryPageBean) {/*checkgroup.html页面里分页查询的方法*/
        /*1.设置分页*/                /*public Page(long current, long size) {this(current, size, 0L);}*//*包米豆自带的分页*/
        Page<Checkgroup> checkgroupPage = new Page<>(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        QueryWrapper<Checkgroup> wrapper = null;
        /*判断并设置分页条件*/
        if (queryPageBean.getQueryString() != null && !" ".equals(queryPageBean.getQueryString())){
            wrapper = new QueryWrapper<>();
            wrapper.eq("code",queryPageBean.getQueryString())
                    .or().like("name",queryPageBean.getQueryString())
                    .or().like("helpCode",queryPageBean.getQueryString());
        }
        /*selectPage条件构造器查询*/
        Page<Checkgroup> selectPage = checkgroupMapper.selectPage(checkgroupPage, wrapper);
        /*把要返回给前台的数据封装进PageResult对象  用那个response取*/
        PageResult pageResult = new PageResult(selectPage.getTotal(),selectPage.getRecords());
        return pageResult;
    }

    @Override
    public Result addCheckGroup(Checkgroup checkgroup, Integer[] checkitemIds) {/*checkgroup.html页面里面的添加组方法*/
        /*主表检查组数据可以直接添加*/
        int row = checkgroupMapper.insert(checkgroup);
        /*判断数组检查项id的长度和是否为空*/
        if (checkitemIds.length > 0 && checkitemIds != null){
            /*有长度并且不为空就循环数组然后添加中间表数据*/
            for (Integer checkitemId : checkitemIds) {
                CheckgroupCheckitem checkgroupCheckitem = new CheckgroupCheckitem();
                /*设置中间表的值*/
                checkgroupCheckitem.setCheckgroupId(checkgroup.getId());
                checkgroupCheckitem.setCheckitemId(checkitemId);
                checkgroupCheckitemMapper.insert(checkgroupCheckitem);
            }
        }
        if (row > 0){
            return new Result(true, MessageConstant.ADD_CHECKGROUP_SUCCESS);
        }
        return new Result(false, MessageConstant.ADD_CHECKGROUP_FAIL);
    }

    @Override
    public Checkgroup getCheckGroupById(Integer id) {/*chegroup.html页面里的编辑检查组方法，先根据id回显主表数据再发送一个回显中间表数据请求*/
        return checkgroupMapper.selectById(id);
    }

    @Override
    public Result editCheckGroup(Checkgroup checkgroup,Integer[] checkitemIds) {/*chegroup.html页面里的编辑检查组方法，在已经回显数据的基础上进行修改，再将选中的检查项都放到一个数组里进行参数传递*/
        /*检查组和可以直接更新*/
        int row = checkgroupMapper.updateById(checkgroup);
        /*根据检查组id用条件构造器删除中间表中的数据，然后重新添加*/
        QueryWrapper<CheckgroupCheckitem> wrapper = new QueryWrapper<>();
        wrapper.eq("checkgroup_id",checkgroup.getId());
        checkgroupCheckitemMapper.delete(wrapper);
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("checkgroup_id",checkgroup.getId());
//        checkgroupCheckitemMapper.deleteByMap(map);
        /*然后重新添加*/
        if (checkitemIds.length > 0 && checkitemIds != null){
            for (Integer checkitemId : checkitemIds) {
                CheckgroupCheckitem checkgroupCheckitem = new CheckgroupCheckitem();
                /*设置中间表的值这里等同于添加，所以中间表两列的id都要添加*/
                checkgroupCheckitem.setCheckgroupId(checkgroup.getId());
                checkgroupCheckitem.setCheckitemId(checkitemId);
                checkgroupCheckitemMapper.insert(checkgroupCheckitem);
            }
        }
        if (row > 0){
            return new Result(true,MessageConstant.EDIT_CHECKGROUP_SUCCESS);
        }
        return new Result(false,MessageConstant.EDIT_CHECKGROUP_FAIL);
    }

    @Override
    public Result deleteCheckGroupId(Integer id) {    /*checkgroup.html页面里的删除组方法，根据row.id进行行数据的删除,需要先删除中间表，再删主表*/
        /*1先根据中间表CheckgroupCheckitem的checkgroup_id删除中间表的数据*/
        CheckgroupCheckitem checkgroupCheckitem = new CheckgroupCheckitem();
        checkgroupCheckitem.setCheckgroupId(id);
        QueryWrapper<CheckgroupCheckitem> wrapper = new QueryWrapper<>();
        wrapper.eq("checkgroup_id",checkgroupCheckitem.getCheckgroupId());
        checkgroupCheckitemMapper.delete(wrapper);

        /*还有个套餐中间表*/
        /*2再根据中间表SetmealCheckgroup的checkgroup_id删除中间表的数据*/
        SetmealCheckgroup setmealCheckgroup = new SetmealCheckgroup();
        setmealCheckgroup.setCheckgroupId(id);
        QueryWrapper<SetmealCheckgroup> setmealWrapper = new QueryWrapper<>();
        setmealWrapper.eq("checkgroup_id",setmealCheckgroup.getCheckgroupId());
        setmealCheckgroupMapper.delete(setmealWrapper);

        /*3最后在根据row.id删除主表*/
        int row03 = checkgroupMapper.deleteById(id);
        if (row03 > 0){
            return new Result(true,MessageConstant.DELETE_CHECKGROUP_SUCCESS);
        }
        return new Result(false,MessageConstant.DELETE_CHECKGROUP_FAIL);
    }

    @Override
    public List<Checkgroup> getAllCheckGroup() {    /*setmeal.html页面里的添加前需要先回显所有的检查组好像可以跟编辑时回显用同一个方法*/
        return checkgroupMapper.selectList(null);

    }

    @Override
    public List<Checkgroup> getCheckgroups() {    /*setmeal.html页面里的编辑前需要先回显所有的检查组好像可以跟添加时回显用同一个方法*/
        return checkgroupMapper.selectList(null);

    }

    @Override
    public List<Integer> getCheckgroupsByGroupById(Integer id) {    /*setmeal.html页面里的编辑找到选中的检查根据id项进行数据回显这个id是row.id,也就是中间表的的行id*/
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("setmeal_id",id);
//        List<SetmealCheckgroup> setmealCheckgroupList = setmealCheckgroupMapper.selectByMap(map);
        /*利用条件构造器，先根据setmeal_id把中间表的数据都找出来返回值为一个中间的集合就有了中间表的所有数据，在弄一个纯int类型的数组，将遍历出来的中间CheckgroupId一个个添加到int数组里，因为返回的数据需要的仅仅是id所以是int类型的数组，不是对象*/
        QueryWrapper<SetmealCheckgroup> wrapper = new QueryWrapper<>();
        wrapper.eq("setmeal_id",id);
        List<SetmealCheckgroup> setmealCheckgroupList = setmealCheckgroupMapper.selectList(wrapper);
        ArrayList<Integer> list = new ArrayList<>();
        int count = 0;
        for (SetmealCheckgroup setmealCheckgroup : setmealCheckgroupList) {
            list.add(setmealCheckgroup.getCheckgroupId());
            count++;
        }
        System.out.println("查到了中间表的数据条数：" + count);
        return list;
    }


}
